package com.fishingwithme.infrastructure.mapper.circle;

import com.fishingwithme.domain.circle.Circle;
import cn.fishingwithme.infrastructure.dtos.circle.*;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fishingwithme.infrastructure.dtos.circle.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface CircleMapper extends BaseMapper<Circle> {
    void add(Circle circle);

    List<CircleDto> getCirclesByLocation(Double latitude, Double longitude, Integer distance);

    int markActive(Long circleId);

    Boolean isActive(Long circleId);

    int markActiveState(Long circleId, Boolean isActive);

    List<Long> getAllActiveCircleIds();

    CircleStatisticsRptDto selectCircleStatistics(Long circleId);

    List<CircleLocationDto> getCircleLocations(Double latitude, Double longitude, Integer distance);

    int addSpotToCircle(Long circleId, Long spotId);

    CircleNewSpotEventDto selectCircleSpot(Long circleId, Long spotId);

    CircleNewSpotEventDto selectNewSpot(Long spotId);

    CircleHarvestShowDto selectShowHarvest(Long id);

    List<CircleSpotDto> queryCircleSpots(@Param("circleId") Long circleId, @Param("userId") Long userId, @Param("queryStr") String queryStr);

    Page<CircleDto> selectCirclePage(Page<CircleDto> page);

    Page<CirclePageDto> selectCirclePageDto(Page<CirclePageDto> page);

    CircleDetailDto selectCircleDetailById(@Param("id") Long id);

    int updateCircle(CircleUpdateDto updateDto);

    /**
     * 根据circleId查询circle范围内的spot数据
     * 1. 查询circle的中心点和多边形边界
     * 2. 计算中心点到多边形顶点的最大距离
     * 3. 查询该距离范围内的spot数据
     * 4. 判断spot是否在多边形内部
     *
     * @param circleId 圈子ID
     * @return 符合条件的spot列表
     */
    List<SpotInCircleDto> selectSpotsInCircle(@Param("circleId") Long circleId);

    /**
     * 获取circle的中心点和多边形边界信息
     *
     * @param circleId 圈子ID
     * @return CircleGeoInfoDto 包含中心点和多边形边界信息
     */
    CircleGeoInfoDto selectCircleGeoInfo(@Param("circleId") Long circleId);

    /**
     * 根据中心点和距离查询范围内的spot，排除已关联到指定圈子的spot
     *
     * @param longitude 中心点经度
     * @param latitude 中心点纬度
     * @param distance 最大距离（米）
     * @param circleId 圈子ID，用于排除已关联的spot
     * @return 范围内的spot列表（排除已关联的）
     */
    List<SpotInCircleDto> selectSpotsByDistance(@Param("longitude") Double longitude, 
                                                @Param("latitude") Double latitude, 
                                                @Param("distance") Double distance,
                                                @Param("circleId") Long circleId);
    
    // 使用现有的addSpotToCircle方法处理关联
    
    /**
     * 分页查询指定圈子的spot列表
     * @param page 分页对象
     * @param circleId 圈子ID
     * @return 分页结果
     */
    IPage<SpotInCircleDto> selectSpotsByCircleId(Page<SpotInCircleDto> page, @Param("circleId") Long circleId);
}
